home *** CD-ROM | disk | FTP | other *** search
- unit spagetti;
- {$DEFINE ROOM}
- interface
- uses
- Classes, Gauges;
-
- const
- MaxPlate = 3;
-
- type
- TSpagettiThread = class(TThread)
- private
- { Private declarations }
- Plate: Integer;
- FoodValue,Sticks: Integer; { 0..100 }
- Food: TGauge;
- public
- constructor Create(ID: Integer; Gauge: TGauge);
- protected
- procedure Execute; override;
- private
- procedure ShowFood;
- procedure Wait(Chop: Integer);
- procedure Signal(Chop: Integer);
- end;
-
- implementation
- uses
- Graphics;
-
- var
- Chopstick: Array[0..MaxPlate] of Integer; { -1 = FREE }
- Room: Word;
-
- { Important: Methods and properties of objects in VCL can only be used in a
- method called using Synchronize, for example,
-
- Synchronize(UpdateCaption);
-
- and UpdateCaption could look like,
-
- procedure TSpagettiThread.UpdateCaption;
- begin
- Form1.Caption := 'Updated in a thread';
- end; }
-
- { TSpagettiThread }
-
- constructor TSpagettiThread.Create(ID: Integer; Gauge: TGauge);
- begin
- inherited Create(False);
- Plate := ID;
- Food := Gauge;
- FoodValue := 100;
- end {Create};
-
- procedure TSpagettiThread.ShowFood;
- begin
- Food.Progress := FoodValue;
- case Sticks of
- 1: Food.ForeColor := clNavy;
- 2: Food.ForeColor := clYellow;
- else Food.ForeColor := clGray;
- end;
- if FoodValue <= 0 then Food.Visible := False
- end {ShowFood};
-
- procedure TSpagettiThread.Wait(Chop: Integer);
- var i: Integer;
- begin
- if Chopstick[Chop] >= 0 then
- begin
- repeat
- for i:=1 to 10000 do if (i div 10000) = 1 then Dec(FoodValue);
- Synchronize(ShowFood) { wait }
- until (Chopstick[Chop] < 0) or (FoodValue <= 0)
- end;
- if FoodValue > 0 then
- begin
- Chopstick[Chop] := Plate { taken by me };
- Inc(Sticks)
- end
- end {Wait};
-
- procedure TSpagettiThread.Signal(Chop: Integer);
- begin
- if Chopstick[Chop] = Plate then { did I take it? }
- begin
- Chopstick[Chop] := -1 { release fork again };
- Dec(Sticks)
- end
- end {Signal};
-
- procedure TSpagettiThread.Execute;
- var i: Integer;
- begin
- { Place thread code here }
- repeat
- for i:=1 to 50000 do if (i mod 10000) = 0 then Dec(FoodValue);
- Synchronize(ShowFood);
- {$IFDEF ROOM}
- if Room > 1 then
- begin
- Dec(Room);
- {$ENDIF}
- Wait(Plate);
- Synchronize(ShowFood);
- if FoodValue > 0 then
- begin
- Wait((Plate+1) mod MaxPlate);
- if FoodValue > 0 then
- for i:=1 to 10000 do
- if (i div 10000) = 1 then FoodValue := 100; { eat }
- Synchronize(ShowFood);
- Signal((Plate+1) mod MaxPlate);
- Synchronize(ShowFood)
- end;
- Signal(Plate);
- Synchronize(ShowFood);
- {$IFDEF ROOM}
- Inc(Room)
- end
- {$ENDIF}
- until Terminated or (FoodValue <= 0)
- end {Execute};
-
-
- var i: Integer;
- begin
- for i:=0 to MaxPlate do Chopstick[i] := -1;
- {$IFDEF ROOM}
- Room := MaxPlate
- {$ENDIF}
- end.
-